/**
 * 生成全局唯一标识符 guid
 * @param {boolean} line 是否带横线
 * @param {string} head 自定义标识
 * @returns 
 */
function guid(line = false, head = '') {
    const _ = line ? '-' : '';
    const S = () => (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    return `${head}${S()}${S()}${_}${S()}${_}${S()}${_}${S()}${_}${S()}${S()}${S()}`;
}
/**
 * 生成全局唯一标识符 nanoid
 * @param {number} size 生成位数
 * @returns 
 */
function nanoid(size = 21) {
    let id = ''
    let bytes = crypto.getRandomValues(new Uint8Array(size))
    while (size--) {
        let byte = bytes[size] & 63
        if (byte < 36) {
            id += byte.toString(36)
        } else if (byte < 62) {
            id += (byte - 26).toString(36).toUpperCase()
        } else if (byte < 63) {
            id += '_'
        } else {
            id += '-'
        }
    }
    return id
}
/**
 * 非常简易的hash运算
 * @param {string} str 文本
 */
function textHax(str) {
    str = String(str)
    for (var i = 0, num = 0, len = str.length; i < len; i++) {
        num += (str.charCodeAt(i) / (i + 1.3))
    }
    return (String(num).replace('.', '') - 0).toString(36)
}

module.exports = {
    guid,             // 全局唯一标识符 guid
    nanoid,           // 生成全局唯一标识符 nanoid nanoid 更加便捷快速
    textHax,          // 非常简易的hash运算
}